﻿package com.adsame.core
{
	import flash.display.MovieClip;
	import flash.utils.*;

	import com.adsame.controllors.*;
	import com.adsame.interfaces.*;
	import com.adsame.utils.*;
	import com.adsame.exceptions.*;

	/**
	 * AsamCtrlManager 
	 *
	 * 广告控制器的管理中心
	 * 用来统一管理各个广告控制器的类实例，访问接口统一化
	 * 
	 * @package com.adsame.core
	 * @version $id$
	 * @copyright Powered By Adsame 2008-2009 (c)
	 * @author olga 
	 * @license 
	 */
	public final class AsamCtrlManager extends MovieClip
	{
		/* ==================== 成员变量定义开始 ==================== */

		/**
		 * 广告控制器的链表，由迭代器方式实现
		 */
		private var __ctrl_iterator : IAsamIterator;

		/**
		 * 广告控制器的事件处理类，用来发送广告执行过程中发生的事件
		 */
		private var __events : IAsamEvent;
		/* ==================== 成员变量定义结束 ==================== */


		/* ==================== 成员函数定义开始 ==================== */

		/**
		 * AsamCtrlManager 
		 *
		 * 构造函数
		 * 
		 * @access public
		 * @return void
		 */
		public function AsamCtrlManager() : void
		{
			this.__ctrl_iterator = new AsamIterator();

			this.__events = new AsamEvent();
		}

		protected function getCtrl(name : String) : Object
		{
			var ad_info = this.__ctrl_iterator.getByName(name);
			if (!ad_info)
			{
				throw new AsamSysCodeException("100002");
			}
			return ad_info;
		}

		/**
		 * setSysCode 
		 *
		 * 添加一个广告位代码
		 * 
		 * @param code : String $code : String 
		 * @param name : String $name : String 
		 * @access public
		 * @return void
		 */
		public function setSysCode(code : String, name : String) : void
		{
			if (!AsamChecker.isUrl(code))
			{
				throw new AsamSysCodeException("100001");
			}

			var ad_info : Object = {
				code 	: code,
				params 	: null,
				adctrl 	: null,
				scope 	: this
			};
			this.__ctrl_iterator.add(ad_info, name);
		}

		/**
		 * executeAd 
		 *
		 * 加载一个广告位代码，
		 * 根据返回参数生成对应类型的广告控制器
		 * 
		 * @param name : String $name : String 
		 * @access public
		 * @return void
		 */
		public function executeAd(name : String) : void
		{
			var ad_info = this.getCtrl(name);
			var this_refer : AsamCtrlManager = this;

			var executeAdComplete : Function = function(params : IAsamParams) : void
			{
				this.params = params;
				this.adctrl = this.scope.factory(params.getAdtype());
				this.adctrl.setParams(params);

				this_refer.__events.fireEvent("afterExecuteAd", this);
			};
			
			var loader : IAsamLoader = new AsamXmlLoader();
			loader.load(ad_info.code, executeAdComplete, ad_info);
		}

		/**
		 * factory 
		 *
		 * 根据指定的广告类型生成对应的广告控制器
		 * 
		 * @param ad_type : String $ad_type : String 
		 * @access public
		 * @return void
		 */
		public function factory(ad_type : String) : IAsamControllor
		{
			// 首部声明需要用到的类实例
			var ctrl : AsamBannerControllor;

			try {
				var cls_name : String = "com.adsame.controllors.Asam" + ad_type + "Controllor";
				var cls_define : Class = getDefinitionByName(cls_name) as Class;
			} catch (e) {
				throw new AsamCtrlException("200001");
			}
			return new cls_define();
		}

		/**
		 * render 
		 * 
		 * @param sence : IAsamSence $sence : IAsamSence 
		 * @access public
		 * @return void
		 */
		public function render(sence : IAsamSence, name : String) : void
		{
			var ad_info = this.getCtrl(name);
			var ctrl : IAsamControllor = ad_info.adctrl;

			if (ctrl)
			{
				ctrl.render(sence);
			}
			else
			{
				var afterExecuteAd_run = function(ctrl) {
					ctrl.adctrl.render(sence);
				};
				this.__events.addListener("afterExecuteAd", afterExecuteAd_run);
			}
		}
		/* ==================== 成员函数定义结束 ==================== */
	}
}
